#!/usr/bin/env python3
'''ultrasonic ranging using I2C'''  # 使用I2C通信协议进行超声波测距
'''software tools : wiringpi'''     # 使用wiringpi库控制
'''hardware       : KS103    '''    # 硬件使用KS103超声波传感器

import wiringpi as wpi  # 导入库并取别名为wpi

# I2C设备参数配置
address = 0x74                      # i2c device address (7位地址，对应十六进制0x74)
wr_cmd = 0xb0                       # range 0-5m, return distance(mm) (写入寄存器的值为0xb0时，为测量距离模式，获得以mm为单位的距离)
h = wpi.wiringPiI2CSetup(address)   # open device at address (初始化I2C连接，在0x74打开设备)

# # 写入寄存器的值为0xb2时，范围0-5m，为测量距离模式，以时间计算，单位us可以获得超声波返回的时间，计算时间可以获得距离 (距离=时间x声速(340m/s)/2)
# rd_cmd = 0xb2                       # range 0-5m, return flight time(us), remember divided by 2

# 便于捕获Ctrl+C中断，从而清理资源并退出
try:
    # 主循环持续获取距离数据
    while True:
        # 向寄存器0x2写入测距命令
        wpi.wiringPiI2CWriteReg8(h, 0x2, wr_cmd)
        
        # 延时等待测量完成（根据设备要求至少33ms后读数据）
        wpi.delay(1000) #unit:ms  MIN ~ 33（实际延时1秒）
        
        # 读取传感器数据寄存器（高位字节在0x02，低位字节在0x03）
        HighByte = wpi.wiringPiI2CReadReg8(h, 0x2) # 从寄存器0x2读取高8位
        LowByte = wpi.wiringPiI2CReadReg8(h, 0x3)  # 从寄存器0x3读取低8位
        
        # 数据合成处理（将两个字节组合为16位整数）
        Dist = (HighByte << 8) + LowByte # 高字节左移8位后与低字节相加
        
        # 输出转换结果（毫米转厘米，Python隐含精度控制，自动打印1位小数）
        print('Distance:', Dist/10.0, 'cm')
        
except KeyboardInterrupt: # 捕获Ctrl+C中断信号
    pass

# 程序终止提示
print('Range over!')  # 无需专门断开端口连接，wiringpi自动释放

